package main

import (
	"fmt"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql" // 加上前缀 "_" 表示只是用到它内部的一些初始化的方法
)

//gorm demo04 查询

// Person 1.定义模型
type Person struct {
	gorm.Model
	Name string
	Age  int64
}

func main() {
	//2.连接 MySQL 数据库
	db, err := gorm.Open("mysql", "root:123456@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}
	defer db.Close()

	//3.把模型与数据库中的表对应起来
	db.AutoMigrate(&Person{})

	// 4.创建
	p1 := Person{Name: "htl", Age: 36}
	db.Create(&p1)
	p2 := Person{Name: "swk", Age: 500}
	db.Create(&p2)

	//5.查询
	//var person Person //声明模型结构体类型变量
	person := new(Person) //返回指针类型，new：创建基本类型，并返回该类型变量的指针；make：创建 map,slice,channel 类型，并返回指针类型
	//查询第一条记录
	db.First(&person) //当主键是数字类型时，才可以使用
	fmt.Printf("person:%#v\n", person)
	//查询所有记录
	var persons []Person
	db.Find(&persons)
	db.Debug().Find(&persons) //Debug() 可以将 sql 语句打印出来
	fmt.Printf("persons:%#v\n", persons)

	//FirstOrInit 获取匹配的第一条记录，否则根据给定的条件初始化一个新的对象（仅支持 struct 和 map 条件）
	var p Person
	db.FirstOrInit(&p, Person{Name: "xyy"})
	fmt.Printf("%#v\n", p)
	//main.Person{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:<nil>}, Name:"xyy", Age:0}

	//Attrs() 如果未找到记录，将使用参数初始化 struct
	//Assign() 不管记录是否找到，都将参数赋值给 struct
	db.Attrs(Person{Age: 18}).FirstOrInit(&p, Person{Name: "xyy"})
	fmt.Printf("%#v\n", p)
	//main.Person{Model:gorm.Model{ID:0x0, CreatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdatedAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletedAt:<nil>}, Name:"xyy", Age:18}

}
